package com.syp.hehe.util.dbrouter.utils;

import java.text.DecimalFormat;

import org.springframework.util.StringUtils;

import com.syp.hehe.util.dbrouter.annotation.RouteConstants;
import com.syp.hehe.util.dbrouter.bean.DBRule;

public class DBRouterUtils {

    /**
     * 对分库分表字段哈希后取绝对值
     * @param fieldId
     * @return
     */
    public static int getHashValue(String fieldId) {
        return Math.abs(getHashCode(fieldId));
    }

    /**
     * 用字段哈希后绝对值对总表数取余数，再除每库表数取商数，得到库索引值
     * @param dbRule
     * @param hashValue
     * @return
     */
    public static int getDBIndex(DBRule dbRule, int hashValue) {
        // 总表数 = 总库数 * 每库表数
        int tableCount = dbRule.getDataSourceKeys().size() * dbRule.getTableNumber();
        return (hashValue%tableCount)/dbRule.getTableNumber();
    }

    /**
     * 用字段哈希后绝对值对每库表数取余数，由于数据源设置是从1开始，所以后面+1操作
     * @param dbRule
     * @param hashValue
     * @return
     */
    public static int getTableIndex(DBRule dbRule, int hashValue) {
        return (hashValue%dbRule.getTableNumber()) + 1;
    }

    /**
     * 表名称格式化<br>
     * 例如：tableStyle = _0000，tbIndex = 129，格式化后为：_0129
     * @param tableStyle
     * @param tbIndex
     * @return
     */
    public static String formatTableName(String tableStyle,long tbIndex) {
        String tableIndex;
        DecimalFormat df = new DecimalFormat();
        if (StringUtils.isEmpty(tableStyle)) {
            tableStyle = RouteConstants.DOROUTE_TABLE_STYLE_DEFAULT;
        }
        df.applyPattern(tableStyle);
        tableIndex =  df.format(tbIndex);
        return tableIndex;
    }

    /**
     * 获取字段的哈希值，为避免特殊字符的问题，使用Base64编码后再哈希<br>
     * @param fieldId
     * @return
     */
    public static int getHashCode(String fieldId) {
        return fieldId.hashCode();
    }
}
